<?php
namespace Todo\Model;
use Think\Model;

/**
 * Created by PhpStorm.
 * User: yepanpan
 * Date: 2016/8/8
 * Time: 17:59
 */
class BaseModel extends Model
{
    public static $STATUS = array(
        1 => '启用',
        0 => '禁用'
    );

    public static $DELETES = array(
        1 => '未删除',
        0 => '已删除'
    );

    public static $PUBLIC = array(
        1 => '公开',
        0 => '私有'
    );

    /**
     * 插入一条数据
     * @param array $data=null 数据，为null则从POST取
     * @return int|bool
     */
    public function insert($data = null){
        if(!$data) $data = $_POST;
        if(!$this->create($data)) return false;
        return $this->add();
    }

    /**
     * 更新一条数据
     * @param $id 主键的值
     * @param array $data=null 数据，为null则从POST取
     * @return bool
     */
    public function update($id,$data=null){
        if(!$data) $data = $_POST;
        $data[$this->getPk()] = $id;
        if(!$this->create($data)) return false;
        return $this->save();
    }

    /**
     * 分页查询
     * @param $where 条件
     * @param $page=0 当前页码
     * @param $limit=20 返回条数
     * @param string $order=id DESC 排序
     * @return mixed 查询结果
     */
    public function pageSelect($where, $page=0, $limit=20, $order='id DESC'){
        return $this->where($where)->page($page, $limit)->order($order)->select();
    }

    /**
     * 查询总数
     * @param $where
     * @return mixed
     */
    public function pageCount($where){
        return $this->where($where)->count();
    }

    /**
     * 查询一条数据
     * @param $where 查询条件
     * @param bool $field=true 返回的字段名称，默认全部返回
     * @return bool|mixed
     */
    public function findOne($where, $field=true){
        $info = $this->where($where)->find();
        if(!$info) return false;

        return $field === true ? $info : $info[$field];
    }

    /**
     * 通过主键取数据
     * @param $id
     * @param bool $field
     */
    public function keyFind($id, $field=true){
        return $this->findOne(array($this->pk => $id), $field);
    }

    /**
     * 启用
     * @param int $id 主键
     * @return bool
     */
    public function enable($id){
        return $this->where(array($this->getPk() => $id))->save(array('status'=>1));
    }

    /**
     * 禁用
     * @param int $id 主键
     * @return bool
     */
    public function disable($id){
        return $this->where(array($this->getPk() => $id))->save(array('status'=>2));
    }

    /**
     * 删除(如果有字段is_del且$true=false,假删除)
     * @param int $id 主键
     * @param boolean $true=false 是否假删除
     * @return bool
     */
    public function del($id, $true=false){
        $this->where(array($this->getPk() => $id));
        if($true) return $this->delete();

        $fields = $this->getDbFields();
        if(in_array('is_del', $fields)) return $this->save(array('is_del'=>1));

        return $this->delete();
    }

    /**
     * 格式化数据
     * @param array $info 一条数据对象
     * @param array $fields
     */
    public function format(&$info, $fields = array('status')){
        if(!$fields) return;

        if(!is_array($fields)) $fields = explode(',', $fields);
        foreach($fields as $field){
            if($field == 'status') $info['status_text'] = ($info['status'] == 1 ? '启用' : '禁用');
        }
    }

    /**
     * 执行SQL
     * @param $sql SQL语句
     * @param array $replace=null 替换
     * @return bool
     */
    public function exeSql($sql, $replace = null){
        if($replace){
            foreach ($replace as $k => $v){
                $sql = str_replace('{{'. $k. '}}', $v, $sql);
            }
        }
        return $this->execute($sql) !== false;
    }
}